From 7afc4b008b7d9def72d1f31037893a54be5d2659 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Mon, 22 Aug 2005 19:58:22 +0000 Subject: [PATCH] We cannot allow nested C functions. They create a stack trampoline when their address is taken, which causes a fault if the system implements NX/XD. Signed-off-by: Keir Fraser --- Config.mk | 2 +- .../arch/xen/i386/mm/ioremap.c | 36 ++++++++++--------- .../arch/xen/x86_64/mm/ioremap.c | 34 +++++++++--------- .../drivers/xen/balloon/balloon.c | 26 +++++++------- 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/Config.mk b/Config.mk index 76180e6b26..2f2183e20e 100644 --- a/Config.mk +++ b/Config.mk @@ -3,7 +3,7 @@ # Currently supported architectures: x86_32, x86_64 XEN_COMPILE_ARCH ?= $(shell uname -m | sed -e s/i.86/x86_32/) XEN_TARGET_ARCH ?= $(XEN_COMPILE_ARCH) -XEN_TARGET_X86_PAE ?= n +XEN_TARGET_X86_PAE ?= y # Tools to run on system hosting the build HOSTCC = gcc diff --git a/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c b/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c index 26a69baa6c..e33dc9b633 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c @@ -368,35 +368,37 @@ int direct_remap_area_pages(struct mm_struct *mm, EXPORT_SYMBOL(direct_remap_area_pages); +static int lookup_pte_fn( + pte_t *pte, struct page *pte_page, unsigned long addr, void *data) +{ + unsigned long *ptep = (unsigned long *)data; + if (ptep) + *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << + PAGE_SHIFT) | + ((unsigned long)pte & ~PAGE_MASK); + return 0; +} + int create_lookup_pte_addr(struct mm_struct *mm, unsigned long address, unsigned long *ptep) { - int f(pte_t *pte, struct page *pte_page, unsigned long addr, - void *data) { - unsigned long *ptep = (unsigned long *)data; - if (ptep) - *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << - PAGE_SHIFT) | - ((unsigned long)pte & ~PAGE_MASK); - return 0; - } - - return generic_page_range(mm, address, PAGE_SIZE, f, ptep); + return generic_page_range(mm, address, PAGE_SIZE, lookup_pte_fn, ptep); } EXPORT_SYMBOL(create_lookup_pte_addr); +static int noop_fn( + pte_t *pte, struct page *pte_page, unsigned long addr, void *data) +{ + return 0; +} + int touch_pte_range(struct mm_struct *mm, unsigned long address, unsigned long size) { - int f(pte_t *pte, struct page *pte_page, unsigned long addr, - void *data) { - return 0; - } - - return generic_page_range(mm, address, size, f, NULL); + return generic_page_range(mm, address, size, noop_fn, NULL); } EXPORT_SYMBOL(touch_pte_range); diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c index c3d6ee3959..c56e92cb62 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c @@ -465,33 +465,35 @@ int direct_remap_area_pages(struct mm_struct *mm, EXPORT_SYMBOL(direct_remap_area_pages); +static int lookup_pte_fn( + pte_t *pte, struct page *pte_page, unsigned long addr, void *data) +{ + unsigned long *ptep = (unsigned long *)data; + if (ptep) *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT) + | ((unsigned long)pte & ~PAGE_MASK); + return 0; +} + int create_lookup_pte_addr(struct mm_struct *mm, unsigned long address, unsigned long *ptep) { - int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) - { - unsigned long *ptep = (unsigned long *)data; - if (ptep) *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT) - | ((unsigned long)pte & ~PAGE_MASK); - return 0; - } - - return generic_page_range(mm, address, PAGE_SIZE, f, ptep); + return generic_page_range(mm, address, PAGE_SIZE, lookup_pte_fn, ptep); } EXPORT_SYMBOL(create_lookup_pte_addr); +static int noop_fn( + pte_t *pte, struct page *pte_page, unsigned long addr, void *data) +{ + return 0; +} + int touch_pte_range(struct mm_struct *mm, unsigned long address, unsigned long size) { - int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) - { - return 0; - } - - return generic_page_range(mm, address, size, f, NULL); -} + return generic_page_range(mm, address, size, noop_fn, NULL); +} EXPORT_SYMBOL(touch_pte_range); diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c index 090a19be4d..5498e5a804 100644 --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c @@ -434,20 +434,20 @@ void balloon_update_driver_allowance(long delta) balloon_unlock(flags); } -struct page *balloon_alloc_empty_page_range(unsigned long nr_pages) +static int dealloc_pte_fn( + pte_t *pte, struct page *pte_page, unsigned long addr, void *data) { - int f(pte_t *pte, struct page *pte_page, - unsigned long addr, void *data) - { - unsigned long mfn = pte_mfn(*pte); - set_pte(pte, __pte_ma(0)); - phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] = - INVALID_P2M_ENTRY; - BUG_ON(HYPERVISOR_dom_mem_op( - MEMOP_decrease_reservation, &mfn, 1, 0) != 1); - return 0; - } + unsigned long mfn = pte_mfn(*pte); + set_pte(pte, __pte_ma(0)); + phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] = + INVALID_P2M_ENTRY; + BUG_ON(HYPERVISOR_dom_mem_op( + MEMOP_decrease_reservation, &mfn, 1, 0) != 1); + return 0; +} +struct page *balloon_alloc_empty_page_range(unsigned long nr_pages) +{ unsigned long vstart, flags; unsigned int order = get_order(nr_pages * PAGE_SIZE); @@ -459,7 +459,7 @@ struct page *balloon_alloc_empty_page_range(unsigned long nr_pages) balloon_lock(flags); BUG_ON(generic_page_range( - &init_mm, vstart, PAGE_SIZE << order, f, NULL) != 0); + &init_mm, vstart, PAGE_SIZE << order, dealloc_pte_fn, NULL)); current_pages -= 1UL << order; balloon_unlock(flags); -- 2.30.2